package entidadesBD;

import java.io.Serializable;

import javax.persistence.*;

import entidadesVO.ArticuloComponentesVO;
import entidadesVO.ArticuloVO;
import entidadesVO.CentroDistribucionVO;

import java.sql.Date;
import java.util.Set;
import java.util.HashSet;

@Entity
@Table(name="articulo")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="discriminador", discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue("TIPO")
public class Articulo implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	protected String descripcion;
	protected float precio;
	protected float descuento;
	protected Set<CentroDistribucion> centrosDeDistribucion = new HashSet<CentroDistribucion>();
	protected String referencia;
	protected String color;
	protected String linea;
	protected Date fechaDeIngreso;
	protected int nuevo;
	protected int mesDeDescuento;
	
	protected int codigoArticulo;
	
	protected Set<ArticuloComponentes> articuloComponentes = new HashSet<ArticuloComponentes>();
	
	public Articulo(String descripcion, float precio, float descuento, String referencia, String color, String linea, Date fechaDeIngreso, int mesDeDescuento) {
		this.descripcion = descripcion;
		this.precio = precio;
		this.descuento = descuento;
		this.referencia = referencia;
		this.color = color;
		this.linea = linea;
		this.fechaDeIngreso = fechaDeIngreso;
		this.mesDeDescuento = mesDeDescuento;
	}
	/*
	 * Constructor Vacio
	 */
	public Articulo(){
		
	}
	/*
	 * Constructor con todos los atributos
	 */
	public Articulo(String descripcion, float precio, float descuento, Set<CentroDistribucion> centrosDeDistribucion, String referencia, String color, String linea, Date fechaDeIngreso, int nuevo, int mesDeDescuento, int codigoArticulo, Set<ArticuloComponentes> articuloComponentes) {
		this.descripcion = descripcion;
		this.precio = precio;
		this.descuento = descuento;
		this.centrosDeDistribucion = centrosDeDistribucion;
		this.referencia = referencia;
		this.color = color;
		this.linea = linea;
		this.fechaDeIngreso = fechaDeIngreso;
		this.nuevo = nuevo;
		this.mesDeDescuento = mesDeDescuento;
		this.codigoArticulo = codigoArticulo;
		this.articuloComponentes = articuloComponentes;
	}
	/*
	 * Constructor sin Set (centrosDeDistribucion y articulosComponentes)
	 */
	public Articulo(String descripcion, float precio, float descuento, String referencia, String color, String linea, Date fechaDeIngreso, int nuevo, int mesDeDescuento, int codigoArticulo) {
		this.descripcion = descripcion;
		this.precio = precio;
		this.descuento = descuento;
		this.referencia = referencia;
		this.color = color;
		this.linea = linea;
		this.fechaDeIngreso = fechaDeIngreso;
		this.nuevo = nuevo;
		this.mesDeDescuento = mesDeDescuento;
		this.codigoArticulo = codigoArticulo;
	}
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	public int getCodigoArticulo(){
		return codigoArticulo;
	}
	public void setCodigoArticulo(int codigoArticulo){
		this.codigoArticulo = codigoArticulo;
	}
	
	@ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY, mappedBy="articulo")
	public Set<CentroDistribucion> getCentrosDeDistribucion() {
		return centrosDeDistribucion;
	}
	public void setCentrosDeDistribucion(
			Set<CentroDistribucion> centrosDeDistribucion) {
		this.centrosDeDistribucion = centrosDeDistribucion;
	}	
	public void addCentroDistribucion(CentroDistribucion centroDistribucion){
		this.centrosDeDistribucion.add(centroDistribucion);
	}
	
	@Column
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	
	@Column
	public String getDescripcion() {
		return descripcion;
	}
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}
	
	@Column
	public float getDescuento() {
		return descuento;
	}
	public void setDescuento(float descuento) {
		this.descuento = descuento;
	}
	
	@Column
	public Date getFechaDeIngreso() {
		return fechaDeIngreso;
	}
	public void setFechaDeIngreso(Date fechaDeIngreso) {
		this.fechaDeIngreso = fechaDeIngreso;
	}
	
	@Column
	public String getLinea() {
		return linea;
	}
	public void setLinea(String linea) {
		this.linea = linea;
	}
	
	@Column
	public int getNuevo() {
		return nuevo;
	}
	public void setNuevo(int nuevo) {
		this.nuevo = nuevo;
	}
	
	@Column
	public float getPrecio() {
		return precio;
	}
	public void setPrecio(float precio) {
		this.precio = precio;
	}
	
	@Column
	public String getReferencia() {
		return referencia;
	}
	public void setReferencia(String referencia) {
		this.referencia = referencia;
	}
	
	@Column 
	public int getMesDeDescuento(){
		return mesDeDescuento;
	}
	public void setMesDeDescuento(int mesDeDescuento){
		this.mesDeDescuento = mesDeDescuento;
	}
	
	@OneToMany(mappedBy = "articulo", fetch = FetchType.EAGER, cascade={CascadeType.ALL})
	public Set<ArticuloComponentes> getArticuloComponentes() {
		return articuloComponentes;
	}
	public void setArticuloComponentes(
			Set<ArticuloComponentes> articuloComponentes) {
		this.articuloComponentes = articuloComponentes;
	}
	public void addArticuloComponentes(ArticuloComponentes articuloComponentes){
		this.articuloComponentes.add(articuloComponentes);
	}
	
	@Transient
	public ArticuloVO getArticuloVO(){
		ArticuloVO articuloVO = new ArticuloVO(descripcion, precio, descuento, referencia, color, linea, fechaDeIngreso, nuevo, mesDeDescuento, codigoArticulo);
	
		Set<CentroDistribucionVO> centrosDeDistribucionVO = new HashSet<CentroDistribucionVO>();
		Object[] centrosDeDistribucionArray = centrosDeDistribucion.toArray();
		
		for (int i = 0; i < centrosDeDistribucionArray.length; i++){
			CentroDistribucion centroDistribucion = (CentroDistribucion)centrosDeDistribucionArray[i];
			CentroDistribucionVO centroDistribucionVO = centroDistribucion.getCentroDistribucionVO();
			centrosDeDistribucionVO.add(centroDistribucionVO);
		}
		articuloVO.setCentrosDeDistribucion(centrosDeDistribucionVO);
		
		Set<ArticuloComponentesVO> articuloComponentesVO = new HashSet<ArticuloComponentesVO>();
		Object[] articuloComponentesArray = articuloComponentes.toArray();
		
		for (int i = 0; i < articuloComponentesArray.length; i++){
			ArticuloComponentes articuloComponentes = (ArticuloComponentes)articuloComponentesArray[i];
			ArticuloComponentesVO articuloComponenteVO = articuloComponentes.getArticuloComponentesVO();
			articuloComponentesVO.add(articuloComponenteVO);
		}
		articuloVO.setArticuloComponentes(articuloComponentesVO);
		
		return articuloVO;
	}
	
	/*
	 * En base a un articulo VO sin codigo genera un articulo 
	 */
	public void setArticulo(ArticuloVO articuloVO){
		this.descripcion = articuloVO.getDescripcion();
		this.precio = articuloVO.getPrecio();
		this.descuento = articuloVO.getDescuento();
		this.referencia = articuloVO.getReferencia();
		this.color = articuloVO.getColor();
		this.linea = articuloVO.getLinea();
		this.fechaDeIngreso = articuloVO.getFechaDeIngreso();
		//Se ingresa el valor utilizando metodos Setter
		//this.nuevo = articuloVO.getNuevo();
		this.mesDeDescuento = articuloVO.getMesDeDescuento();
	}
}
